#include "lib/print.h"
#include "mem/pmem.h"
#include "mem/vmem.h"
#include "proc/cpu.h"
#include "trap/trap.h"
#include "dev/console.h"
#include "dev/plic.h"
#include "dev/vio.h"
#include "dev/timer.h"
#include "fs/base_buf.h"
#include "riscv.h"
#include "sbi.h"

volatile static bool first = true;        // 当前核心是否是第一个启动的核心
volatile static bool other = false;       // 其他核心是否可以启动

// 系统初始化 + 第一个用户态进程 + 调度启动
void main()
{
    if(first) {
        first = false;
        __sync_synchronize();

        cons_init();        // 中控台
        print_init();       // 标准输出

        pmem_init(false);   // 物理内存
        uvm_init();         // user mem init
        kvm_init();         // kernel mem init
        kvm_inithart();     // 开启分页
        proc_init();        // 进程列表

        timer_init();       // 时钟模块        
        trap_init();        // 中断和异常
        trap_inithart();    // 修改trap处理函数 + 打开中断总开关
        plic_init();        // 中断控制器
        plic_inithart();    // 使能具体的中断

        disk_init();        // 初始化并激活磁盘
        buf_init();         // 初始化buf_cache

        proc_userinit();    // 第一个用户进程

        __sync_synchronize();
        // other = true;
    } else {
        while(!other);
        __sync_synchronize();
        kvm_inithart();
        trap_inithart();
        plic_inithart();
        printf("hart %d is booting\n", mycpuid());
    }
    proc_schedule();        // 调度开始

    panic("never come back\n");
}
